home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / fracaga.lha / Comms / fracaga.s
Encoding:
Text File  |  1980-01-06  |  10.7 KB  |  633 lines

  1. ùúùúøº÷øº÷øº÷øº÷øº÷øº÷øº÷øº÷øº÷
  2.         SECTION   DemoTemplate,code
  3.  
  4.         INCDIR    "xtc:coding/include/"
  5.  
  6.         INCLUDE    "exec/exec_lib.i"
  7.         INCLUDE    "hardware/custom.i"
  8.         INCLUDE    "hardware/dmabits.i"
  9.         INCLUDE "hardware/blit.i"
  10.         INCLUDE    "math/ffp.i"
  11.  
  12.         INCDIR    "df0:"
  13.  
  14. WidthofPlane    EQU    640
  15. HeightofPlane    EQU    200
  16. Modulo        EQU    WidthofPlane/8
  17. SizeOfPlane    EQU    Modulo*HeightofPlane
  18. Planes        EQU    8        
  19. CUSTOM        EQU    $DFF000
  20.  
  21.         move.l    #Screen+(0*SizeOfPlane),d0
  22.         move.w    d0,Plane1Lo
  23.         swap    d0
  24.         move.w    d0,Plane1Hi
  25.  
  26.         move.l    #Screen+(1*SizeOfPlane),d0
  27.         move.w    d0,Plane2Lo
  28.         swap    d0
  29.         move.w    d0,Plane2Hi
  30.  
  31.         move.l    #Screen+(2*SizeOfPlane),d0
  32.         move.w    d0,Plane3Lo
  33.         swap    d0
  34.         move.w    d0,Plane3Hi
  35.  
  36.         move.l    #Screen+(3*SizeOfPlane),d0
  37.         move.w    d0,Plane4Lo
  38.         swap    d0
  39.         move.w    d0,Plane4Hi
  40.  
  41.         move.l    #Screen+(4*SizeOfPlane),d0
  42.         move.w    d0,Plane5Lo
  43.         swap    d0
  44.         move.w    d0,Plane5Hi
  45.  
  46.         move.l    #Screen+(5*SizeOfPlane),d0
  47.         move.w    d0,Plane6Lo
  48.         swap    d0
  49.         move.w    d0,Plane6Hi
  50.  
  51.         move.l    #Screen+(6*SizeOfPlane),d0
  52.         move.w    d0,Plane7Lo
  53.         swap    d0
  54.         move.w    d0,Plane7Hi
  55.  
  56.         move.l    #Screen+(7*SizeOfPlane),d0
  57.         move.w    d0,Plane8Lo
  58.         swap    d0
  59.         move.w    d0,Plane8Hi
  60.  
  61.         lea    (CUSTOM).l,a6
  62.  
  63.         CALLEXEC    Forbid
  64.  
  65.          moveq    #0,d0
  66.         move.l    #FFPNAME,a1
  67.         CALLEXEC    OpenLibrary
  68.         move.l    d0,_MathBase
  69.  
  70.          moveq    #0,d0
  71.         move.l    #gfxlib,a1
  72.         CALLEXEC    OpenLibrary
  73.          move.l     d0,_GfxBase
  74.         move.l    d0,a0
  75.          add.l     #$32,a0
  76.          move.w     #$A0,$dff096
  77.          move.l     (a0),oldcopper
  78.          move.l     #newcopper,(a0)
  79.          move.w     #$8080,$dff096
  80.          move.w     #$8020,$dff09a
  81.          move.l     $6c.w,old+2
  82.          move.l  #new,$6c.w
  83.     
  84.         jsr    aga
  85.  
  86.         move.l    #adec,a0
  87.         jsr    ASCIITOFFP
  88.         move.l    d0,a
  89.  
  90.         move.l    #bdec,a0
  91.         jsr    ASCIITOFFP
  92.         move.l    d0,b
  93.         move.l    d0,bstore
  94.         
  95.         move.l    #aupperdec,a0
  96.         jsr    ASCIITOFFP
  97.         move.l    d0,aupper
  98.  
  99.         move.l    #bupperdec,a0
  100.         jsr    ASCIITOFFP
  101.         move.l    d0,bupper
  102.  
  103.         move.l    #pinitdec,a0
  104.         jsr    ASCIITOFFP
  105.         move.l    d0,pstore
  106.  
  107.         move.l    #qinitdec,a0
  108.         jsr    ASCIITOFFP
  109.         move.l    d0,qstore
  110.  
  111. ;Find out step (stepa) using horizontal placement of mandelbrot compared to
  112. ;size of screen
  113.  
  114.         move.l    a,d1
  115.         move.l    aupper,d0
  116.         CALLFFP SPSub
  117.         move.l    d0,d6
  118.         move.l    #HorizScreen,a0
  119.         jsr    ASCIITOFFP
  120.         move.l    d0,d1
  121.         move.l    d6,d0
  122.         CALLFFP    SPDiv
  123.         move.l    d0,stepa
  124.  
  125. ;Find out step (stepb) using vertical placement of mandelbrot compared to
  126. ;size of screen    
  127.  
  128.         move.l    b,d1
  129.         move.l    bupper,d0
  130.         CALLFFP SPSub
  131.         move.l    d0,d6
  132.         move.l    #VertScreen,a0
  133.         jsr    ASCIITOFFP
  134.         move.l    d0,d1
  135.         move.l    d6,d0
  136.         CALLFFP    SPDiv
  137.         move.l    d0,stepb
  138.  
  139. ;Find out horizontal pixel multiplication factor
  140.  
  141.         move.l    One,d0
  142.         move.l    stepa,d1
  143.         CALLFFP    SPDiv
  144.         move.l    d0,HorizMult
  145.  
  146. ;Find out vertical pixel multiplication factor
  147.  
  148.         move.l    One,d0
  149.         move.l    stepb,d1
  150.         CALLFFP    SPDiv
  151.         move.l    d0,VertMult
  152.  
  153.         
  154.         *** MAIN PROGRAM ***
  155.         lea    Mult80,a2
  156.         move.l    #Screen,a5
  157. wait:
  158.  
  159.  
  160.         move.l    a,d5
  161.         move.l    b,a3
  162.  
  163. ResVals        move.l    pstore,d7    ;d7=p
  164.         move.l    qstore,d6    ;d6=q
  165.         move.w    #0,iteration
  166.  
  167. IterLoop    move.l    d7,d0
  168.         move.l    d0,d1        
  169.         CALLFFP    SPMul
  170.         move.l    d0,d2
  171.  
  172.         move.l    d6,d0
  173.         move.l    d0,d1
  174.         CALLFFP    SPMul
  175.         move.l    d2,d1
  176.         move.l    d0,d3    
  177.         
  178.         CALLFFP    SPAdd
  179.  
  180.         move.l    #$80000043,d1    ;4
  181.         CALLFFP    SPCmp
  182.         bge.b    OutIter
  183.  
  184.         cmp.w    #32,iteration
  185.         bge.b    OutIter
  186.  
  187. ;PNEW=P*P-Q*Q+A (P*P and Q*Q have previously been calculated and placed in
  188. ;        d2 and d3)
  189.  
  190.         move.l    d3,d1
  191.         move.l    d2,d0
  192.  
  193.         CALLFFP    SPSub
  194.  
  195.         move.l    d5,d1
  196.  
  197.         CALLFFP    SPAdd
  198.  
  199.         move.l    d0,d3
  200.  
  201. ;QNEW = 2*P*Q+B    Tricky one this on ehh chappy
  202.  
  203.         move.l    #$80000042,d0    ;2
  204.         move.l    d7,d1
  205.  
  206.         CALLFFP SPMul
  207.  
  208.         move.l    d6,d1
  209.  
  210.         CALLFFP    SPMul
  211.  
  212.         move.l    a3,d1
  213.  
  214.         CALLFFP    SPAdd
  215.  
  216.         move.l    d0,d6
  217.         move.l    d3,d7
  218.  
  219.         add.w    #1,iteration
  220.         bra.w    IterLoop
  221.  
  222. OutIter        move.w    iteration,d0
  223.         move.w    d0,colour
  224.  
  225.         move.l    HorizMult,d0    
  226.         move.l    d5,d1
  227.         CALLFFP    SPMul
  228.         CALLFFP    SPFix
  229.         add.l    #160,d0
  230.         move.l    d0,d3
  231.  
  232.         move.l    VertMult,d0    
  233.         move.l    a3,d1
  234.         CALLFFP    SPMul
  235.         CALLFFP SPFix
  236.         move.l    #100,d1
  237.         sub.l    d0,d1
  238.         move.l    d3,d0
  239.         
  240. Plot
  241. ;        moveq    #0,d3
  242.         move.w    colour,d3
  243.         moveq.l    #0,d4
  244.         move.l    a5,a4
  245.  
  246. CalcPixel:    add.w d1,d1        
  247.         move.w (a2,d1),d1    
  248.         move.w d0,d2
  249.         lsr.w #3,d2        
  250.         add.w d2,d1
  251.         not.b d0        
  252.         move.l    #4,d2
  253. LOOP256    
  254.         btst    d4,d3
  255.         bne.s    DPP
  256.         bset     d0,(a4,d1.w)    
  257. DPP        addq.b    #1,d4
  258.         add.l    #SizeOfPlane,a4
  259.         dbra    d2,LOOP256
  260.  
  261.          btst     #$6,$bfe001.l
  262.          beq.b     Exit
  263.  
  264.         move.l    a3,d0
  265.         move.l    stepb,d1
  266.         CALLFFP    SPAdd
  267.         move.l    d0,a3
  268.         move.l    bupper,d1        
  269.         CALLFFP    SPCmp
  270.         blt.w    ResVals
  271.  
  272.         move.l    bstore,a3
  273.  
  274.         move.l    d5,d0
  275.         move.l    stepa,d1
  276.         CALLFFP    SPAdd
  277.         move.l    d0,d5
  278.         move.l    aupper,d1        
  279.         CALLFFP    SPCmp
  280.         blt.w    ResVals
  281.  
  282. Nomore        btst    #6,$bfe001.l
  283.         bne.s    Nomore
  284.         
  285.         *** EXIT PROGRAM ***
  286. Exit
  287.          move.l     old+2,$6c.w
  288.         move.l    _GfxBase,a0
  289.          add.l    #$32,a0
  290.         move.w    #$0080,$dff096
  291.          move.l    oldcopper,(a0)
  292.         move.w    #$8020,$dff096
  293.          move.w    #$8080,$dff096
  294.  
  295. error:        CALLEXEC  Permit
  296.  
  297. ;         moveq    #0,d0
  298. ;        move.l    #FFPNAME,a1
  299. ;        CALLEXEC    CloseLibrary
  300.  
  301. ;         moveq    #0,d0
  302. ;        move.l    #gfxlib,a1
  303. ;        CALLEXEC    CloseLibrary
  304.  
  305.         moveq     #0,d0
  306.          rts
  307.  
  308.         *** LEVEL 3 INTERRUPT ***
  309.  
  310. new:         movem.l     d0-d7/a0-a6,-(sp)
  311.         btst     #4,($dff000+intreqr+1).l
  312.          beq.b     out
  313.         lea    (CUSTOM).l,a6
  314. out:         movem.l     (sp)+,d0-d7/a0-a6
  315. old:         jmp    0.l
  316. fred        dc.w    0
  317.  
  318. AGA:        lea    CopCol,a0
  319.         move.w    #$2009,d0
  320.         move.l    #15,d5
  321.         move.l    #$306,d1
  322.         move.l    #$000,d3
  323.         move.l    #$503,d4
  324.         move.l    #$000,d6
  325. OuterLoop:    move.w    #$f,d2
  326. InnerLoop    move.w    d0,(a0)+
  327.         add.w    #$0100,d0
  328.         move.w    #$fffe,(a0)+
  329.         move.w    #$0106,(a0)+
  330.         move.w    #$0000,(a0)+
  331.         move.w    #$180,(a0)+
  332.         move.w    d1,(a0)+
  333.         move.w    #$0106,(a0)+
  334.         move.w    #$0200,(a0)+
  335.         move.w    #$180,(a0)+
  336.         move.w    d3,(a0)+
  337.         move.w    #$0106,(a0)+
  338.         move.w    #$0000,(a0)+
  339.         move.w    #$182,(a0)+
  340.         move.w    d4,(a0)+
  341.         move.w    #$0106,(a0)+
  342.         move.w    #$0200,(a0)+
  343.         move.w    #$182,(a0)+
  344.         move.w    d6,(a0)+
  345.         add.w    #$0010,d3                
  346.         add.w    #$001,d6                
  347.         dbra    d2,InnerLoop
  348.         add.w    #$0010,d1
  349.         add.w    #$001,d4
  350.         dbra    d5,OuterLoop
  351.         rts
  352.  
  353. ASCIITOFFP
  354. LeadingSpace
  355.         cmpi.b    #" ",(a0)
  356.         bne.s    CheckNeg
  357.         add.l    #1,a0
  358.         bra.s    LeadingSpace
  359. CheckNeg
  360.         move.l    #0,Negative
  361.         cmpi.b    #"-",(a0)
  362.         bne.s    PositivePart
  363.         move.l    #128,Negative
  364.         adda.l    #1,a0
  365. PositivePart
  366.         move.l    #0,Ritodp
  367.         move.l    #0,Leftodp
  368.         move.l    #0,RdpDigits
  369.         move.l    #0,LdpDigits
  370.         move.l    #0,FloatNum
  371.         moveq.l    #0,d4
  372.         bsr.w    DoPart
  373.         tst.l    d1
  374.         bne.w    ConvertError
  375.         move.l    d0,Leftodp
  376.         move.l    d2,LdpDigits
  377.         cmp.b    #".",(a0)
  378.         bne.w    LeftOnly
  379.         adda.l    #1,a0
  380.         move.l    #1,d4
  381.         bsr.w    DoPart
  382.         tst.l    d1
  383.         bne.w    ConvertError
  384.         move.l    d0,Ritodp
  385.         move.l    d2,RdpDigits
  386. FiniLeft
  387.         move.l    LdpDigits,d7
  388.         subq.l    #7,d7
  389.         ble.s    FiniRight
  390.         move.l    Leftodp,d0
  391.         beq.s    FiniRight
  392.         move.l    TEN,d2
  393. Loop
  394.         CALLFFP    SPMul
  395.         subq.l    #1,d7
  396.         bne.s    Loop
  397.         move.l    d0,Leftodp
  398. FiniRight    
  399.         move.l    RdpDigits,d7
  400.         beq.s    FinishConv
  401.         move.l    Ritodp,d0
  402.         beq.s    FinishConv
  403.         move.l    TEN,d1
  404. Loop2        
  405.         CALLFFP    SPDiv
  406.         subq.l    #1,d7
  407.         bne.s    Loop2
  408.         move.l    d0,Ritodp
  409. FinishConv
  410.         move.l    Ritodp,d0
  411.         move.l    Leftodp,d1
  412.         CALLFFP    SPAdd
  413. LeftOnly    
  414.         moveq    #0,d1
  415.         move.l    Negative,d3
  416.         eor.l    d3,d0
  417.         move.l    d0,FloatNum
  418. ConvertError
  419.         rts
  420. DoPart
  421.         move.l    #0,Integer
  422.         moveq    #0,d0
  423.         moveq    #0,d1
  424.         moveq    #0,d2
  425.         moveq    #0,d3
  426.         moveq    #0,d5
  427. LeadingZero
  428.         move.b    (a0)+,d3
  429.         cmpi.b    #"0",d3
  430.         bne.s    FirstDiga
  431.         tst.l    d4
  432.         beq.s    LeadingZero
  433.         addq.l    #1,d5
  434.         bra.s    LeadingZero
  435. FirstDig
  436.         move.b    (a0)+,d3
  437. FirstDiga
  438.         cmpi.b    #"9",d3
  439.         bhi.s    NoMoreDigits
  440.         cmpi.b    #"0",d3
  441.         blt.s    NoMoreDigits
  442.         andi.l    #$0f,d3
  443.         lsl.l    #1,d0
  444.         move.l    d0,d1
  445.         lsl.l    #2,d0
  446.         add.l    d1,d0
  447.         add.l    d3,d0
  448.         addq.l    #1,d2
  449.         cmpi.l    #7,d2
  450.         bne.s    FirstDig
  451. MoreDigits    
  452.         move.b    (a0)+,d3
  453.         cmpi.b    #"9",d3
  454.         bhi.s    NoMoreDigits
  455.         cmpi.b    #"0",d3
  456.         blt.s    NoMoreDigits
  457.         tst.l    d4
  458.         bne.s    MoreDigits
  459.         addq.l    #1,d2
  460.         cmpi.l    #18,d2
  461.         bne.s    MoreDigits
  462. TooMany
  463.         moveq    #1,d1
  464.         bra.b    AErrorExit
  465. NoMoreDigits    
  466.         add.l    d5,d2
  467.         suba.l    #1,a0
  468.         move.l    d0,integer
  469.         tst.l    d0
  470.         beq.b    PartDone
  471.         move.l    #97,d1
  472. Loop3
  473.         subq.l    #1,d1
  474.         asl.l    #1,d0
  475.         bcc.s    Loop3
  476.         roxr.l    #1,d0
  477.         andi.l    #$ffffff00,d0
  478.         eor.l    d1,d0
  479. PartDone    
  480.         moveq    #0,d1
  481. AErrorExit
  482.         rts
  483.  
  484.  
  485.  
  486. *** Vars ***
  487.  
  488. gfxlib        dc.b    "graphics.library",0
  489.         EVEN
  490. _GfxBase    dc.l    0
  491. oldcopper    dc.l    0
  492.  
  493. colour        dc.b    4
  494.         EVEN
  495. Mult80:
  496. X        set 0
  497.         rept 256
  498.         dc.w 40*X
  499. X        set X+1
  500.         endr
  501.  
  502. a        dc.l    0
  503. bstore        dc.l    0
  504. b        dc.l    0
  505. aupper        dc.l    0
  506. bupper        dc.l    0
  507. p        dc.l    0
  508. q        dc.l    0
  509. pstore        dc.l    0
  510. qstore        dc.l    0
  511. stepa        dc.l    0
  512. stepb        dc.l    0
  513. qnew        dc.l    0
  514. pnew        dc.l    0
  515. horizmult    dc.l    0
  516. vertmult    dc.l    0
  517. One        dc.l    $80000041
  518. iteration    dc.w    0
  519. adec        dc.b    "-2.0",0
  520.         EVEN
  521. bdec        dc.b    "-2",0
  522.         EVEN
  523. aupperdec    dc.b    "2",0
  524.         EVEN
  525. bupperdec    dc.b    "2",0
  526.         EVEN
  527. pdec        dc.l    0,0
  528.         EVEN
  529. qdec        dc.l    0,0
  530.         EVEN
  531. stepadec    dc.b    "0.02",0
  532.         EVEN
  533. stepbdec    dc.b    "0.02",0
  534.         EVEN
  535. pinitdec    dc.b    "0",0
  536.         EVEN
  537. qinitdec    dc.b    "0",0
  538.         EVEN
  539. horizscreen    dc.b    "200",0
  540.         EVEN
  541. vertscreen    dc.b    "200",0
  542.         EVEN
  543.  
  544.  
  545.  
  546. FFPNAME    dc.b    'mathffp.library',0
  547.         EVEN
  548. _MathBase    dc.l    0
  549. Leftodp        dc.l    0
  550. LdpDigits    dc.l    0
  551. Ritodp    dc.l    0
  552. RdpDigits    dc.l    0
  553. FloatNum    dc.l    0
  554. integer        dc.l    0
  555. TEN        dc.l    $a0000044
  556. Negative    dc.l    0
  557.  
  558.         SECTION   DemoTemplatedata,data_c
  559.         
  560.  
  561. newcopper:    dc.w    intreq,$8010
  562.         dc.w    $0501,$ff00
  563.         dc.w    $8e,$2c81    
  564.         dc.w    $90,$32c1
  565.         dc.w    $92,$38
  566.         dc.w    $94,$d0
  567.         dc.w    $102,$0    ;Screen Offset
  568.         dc.w    $108,0    ;Even Modulo
  569.         dc.w    $10a,0    ;Odd Modulo
  570.         dc.w    $180,0
  571.  
  572.         dc.w    $e0
  573. Plane1Hi    dc.w    0,$e2
  574. Plane1Lo    dc.w    0,$e4
  575. Plane2Hi    dc.w    0,$e6
  576. Plane2Lo    dc.w    0,$e8
  577. Plane3Hi    dc.w    0,$ea
  578. Plane3Lo    dc.w    0,$ec
  579. Plane4Hi    dc.w    0,$ee
  580. Plane4Lo    dc.w    0,$f0
  581. Plane5Hi    dc.w    0,$f2
  582. Plane5Lo    dc.w    0,$f4
  583. Plane6Hi    dc.w    0,$f6
  584. Plane6Lo    dc.w    0,$f8
  585. Plane7Hi    dc.w    0,$fa
  586. Plane7Lo    dc.w    0,$fc
  587. Plane8Hi    dc.w    0,$fe
  588. Plane8Lo    dc.w    0
  589.         dc.w    $106,$000,$180,$000,$106,$200,$180,$000
  590.         dc.w    $106,$000,$182,$0f0,$106,$200,$182,$080
  591.         dc.w    $106,$000,$184,$0f0,$106,$200,$184,$0f0
  592.         dc.w    $106,$000,$186,$0e0,$106,$200,$186,$080
  593.         dc.w    $106,$000,$188,$0e0,$106,$200,$188,$0f0
  594.         dc.w    $106,$000,$18a,$0d0,$106,$200,$18a,$080
  595.         dc.w    $106,$000,$18c,$0d0,$106,$200,$18c,$0f0
  596.         dc.w    $106,$000,$18e,$0c0,$106,$200,$18e,$080
  597.         dc.w    $106,$000,$190,$0c0,$106,$200,$190,$0f0
  598.         dc.w    $106,$000,$192,$0b0,$106,$200,$192,$080
  599.         dc.w    $106,$000,$194,$0b0,$106,$200,$194,$0f0
  600.         dc.w    $106,$000,$196,$0a0,$106,$200,$196,$080
  601.         dc.w    $106,$000,$198,$0a0,$106,$200,$198,$0f0
  602.         dc.w    $106,$000,$19a,$090,$106,$200,$19a,$080
  603.         dc.w    $106,$000,$19c,$090,$106,$200,$19c,$0f0
  604.         dc.w    $106,$000,$19e,$080,$106,$200,$19e,$080
  605.         dc.w    $106,$000,$1a0,$080,$106,$200,$1a0,$0f0
  606.         dc.w    $106,$000,$1a2,$070,$106,$200,$1a2,$080
  607.         dc.w    $106,$000,$1a4,$070,$106,$200,$1a4,$0f0
  608.         dc.w    $106,$000,$1a6,$060,$106,$200,$1a6,$080
  609.         dc.w    $106,$000,$1a8,$060,$106,$200,$1a8,$0f0
  610.         dc.w    $106,$000,$1aa,$050,$106,$200,$1aa,$080
  611.         dc.w    $106,$000,$1ac,$050,$106,$200,$1ac,$0f0
  612.         dc.w    $106,$000,$1ae,$040,$106,$200,$1ae,$080
  613.         dc.w    $106,$000,$1b0,$040,$106,$200,$1b0,$0f0
  614.         dc.w    $106,$000,$1b2,$030,$106,$200,$1b2,$080
  615.         dc.w    $106,$000,$1b4,$030,$106,$200,$1b4,$0f0
  616.         dc.w    $106,$000,$1b6,$020,$106,$200,$1b6,$080
  617.         dc.w    $106,$000,$1b8,$020,$106,$200,$1b8,$0f0
  618.         dc.w    $106,$000,$1ba,$010,$106,$200,$1ba,$080
  619.         dc.w    $106,$000,$1bc,$010,$106,$200,$1bc,$0f0
  620.         dc.w    $106,$000,$1be,$000,$106,$200,$1be,$080
  621.  
  622.         dc.w    $2209,$fffe
  623.         dc.w    $100,$5200
  624. CopCol        dcb.w    256*18,0
  625.                 
  626.         dc.w    $f809,$fffe
  627.         dc.w    $100,$0200
  628.         dc.w    $ffff,$fffe
  629.         EVEN
  630. screen        dcb.b    SizeOfPlane*Planes,0
  631.         EVEN
  632.  
  633.